using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using System.Data.Common;
using System.Data;
using Sinacor.Servicos.Comum.Util.SGBD;
using Sinacor.Servico.Bovespa.BovespaBase.Util;
using Sinacor.Servico.Bovespa.Ordens;


namespace Sinacor.Servico.Bovespa.Ordens.ResourceAccess
{
    public class Observacao : BaseResourceAccess
    {
        public Observacao()
            : base(AuthorizationContext.Current.CompanyId) 
        {
        
        }
        /// <summary>
        /// Servico responsavel por trazer a observacao de uma ordem
        /// Historico:
        /// Data: 27/12/2007
        /// Autor: Ludmilla Modesto 
        /// Observacao: Criacao da Operacao
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public BusinessEntity.Observacao ConsultarObservacao(BusinessEntity.Observacao request)
        {
            DbCommand dbCommand;
            DBParameters dbParams = new DBParameters();

            StringBuilder sqlComando = new StringBuilder();
            sqlComando.AppendLine("SELECT A.DS_OBS ");
            sqlComando.AppendLine("FROM TOROBSER A ");
            sqlComando.AppendLine("WHERE ");
            sqlComando.AppendLine("A.DT_DATORD = :DataOrdem ");
            sqlComando.AppendLine("and A.NR_SEQORD = :NumeroOrdem ");
            sqlComando.AppendLine("and A.NR_SUBSEQ = :SubsequenciaOrdem ");

            dbCommand = this.DataBase.GetSqlStringCommand(sqlComando.ToString());

            dbParams.Add("NumeroOrdem", DbType.Int32, request.Ordem.NumeroOrdem);
            dbParams.Add("SubsequenciaOrdem", DbType.Int32, request.Ordem.NumeroOrdemSubSequencia);
            dbParams.Add("DataOrdem", DbType.DateTime, request.Ordem.DataOrdem);
            dbParams.PopulaParametros(this.DataBase, dbCommand);

            BusinessEntity.Observacao beObservacao = new BusinessEntity.Observacao();
            beObservacao.Descricao  = Convert.ToString(this.DataBase.ExecuteScalar(dbCommand));

            return beObservacao;
        }

        /// <summary>
        /// Servico responsavel por alterar ou inserir uma observacao de uma ordem
        /// Historico:
        /// Data: 2/01/2007
        /// Autor: Ludmilla Modesto 
        /// Observacao: Criacao da Operacao
        /// 
        /// Data : 21/02/2008
        /// Autor: Eduardo Sertorio
        /// Obs. : Incluir retorno do numero de linhas afetadas para validacao
        /// </summary>
        /// <param name="request"></param>
        /// <returns>int</returns>
        public int AlterarObservacao(BusinessEntity.Observacao request)
        {
            StringBuilder sqlComando = new StringBuilder();
            DbCommand dbCommand;
            bool existeObs = VerificaExistenciaObservacao(request);

            if (existeObs)
            {
                sqlComando.AppendLine("UPDATE TOROBSER ");
                sqlComando.AppendLine("set ds_obs = substr(ds_obs||';'||:Observacao,1,120) ");
                sqlComando.AppendLine(" WHERE DT_DATORD = :DataOrdem ");
                sqlComando.AppendLine(" AND NR_SEQORD = :NumeroOrdem ");
                sqlComando.AppendLine(" AND NR_SUBSEQ = :SubsequenciaOrdem ");
            }
            else
            {
                sqlComando.AppendLine("INSERT INTO TOROBSER ");
                sqlComando.AppendLine("( DT_DATORD, ");
                sqlComando.AppendLine("NR_SEQORD, ");
                sqlComando.AppendLine("NR_SUBSEQ, ");
                sqlComando.AppendLine("DT_HORORD, ");
                sqlComando.AppendLine("DS_OBS ) ");
                sqlComando.AppendLine("VALUES ");
                sqlComando.AppendLine("( :DataOrdem, ");
                sqlComando.AppendLine(":NumeroOrdem , ");
                sqlComando.AppendLine(":SubsequenciaOrdem, ");
                sqlComando.AppendLine(":DataHoraOrdem, ");
                sqlComando.AppendLine(":Observacao) ");                
            }

            dbCommand = this.DataBase.GetSqlStringCommand(sqlComando.ToString());

            this.DataBase.AddInParameter(dbCommand, "NumeroOrdem", DbType.Int32, request.Ordem.NumeroOrdem);
            this.DataBase.AddInParameter(dbCommand, "SubsequenciaOrdem", DbType.Int32, request.Ordem.NumeroOrdemSubSequencia);
            this.DataBase.AddInParameter(dbCommand, "DataOrdem", DbType.DateTime, request.Ordem.DataOrdem);
            this.DataBase.AddInParameter(dbCommand, "Observacao", DbType.String, request.Descricao);

            if (existeObs)
                this.DataBase.AddInParameter(dbCommand, "DataHoraOrdem", DbType.DateTime, request.Ordem.HoraOrdem);

            return this.DataBase.ExecuteNonQuery(dbCommand);
        }

        private Boolean VerificaExistenciaObservacao(BusinessEntity.Observacao request)
        {
            Boolean isExisteObservacao;
            Sinacor.Servicos.Comum.Util.SGBD.DBParameters dbParams = new Sinacor.Servicos.Comum.Util.SGBD.DBParameters();
            DbCommand dbCommand;

            StringBuilder sqlComando = new StringBuilder();

            sqlComando.AppendLine(" SELECT 0 ");
            sqlComando.AppendLine(" FROM TOROBSER ");
            sqlComando.AppendLine(" WHERE DT_DATORD = :DataOrdem ");
            sqlComando.AppendLine(" AND NR_SEQORD = :NumeroOrdem ");
            sqlComando.AppendLine(" AND NR_SUBSEQ = :SubsequenciaOrdem ");

            dbParams.Add("DataOrdem", DbType.Date, request.Ordem.DataOrdem);
            dbParams.Add("NumeroOrdem", DbType.Int32, request.Ordem.NumeroOrdem);
            dbParams.Add("SubsequenciaOrdem", DbType.Int32, request.Ordem.NumeroOrdemSubSequencia);

            dbCommand = this.DataBase.GetSqlStringCommand(sqlComando.ToString());
            dbParams.PopulaParametros(this.DataBase, dbCommand);

            return isExisteObservacao = Convert.ToString((this.DataBase.ExecuteScalar(dbCommand))) == "0";
        }
    }
}
